#include<stdio.h>
#include<string.h>
#include<errno.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<sqlite3.h>
#include"cJSON.h"

#define LISTEN_PORT          8889
#define BACKLOG              13  
int parser_json(char *buf,char *id,int idsize,float *temp,char *timep);

int main(int argc,char **argv)
{
    int      rv = -1; 
    int      listen_fd, client_fd = -1; 
    struct sockaddr_in    serv_addr;
    struct sockaddr_in    cli_addr;
    socklen_t             cliaddr_len;
    char                  buf[1024];
    char                  devid[8];    /*rpi#001*/
    float                 temp;
    char                  timep[32];
    sqlite3              *db;
    char                 *zErrMsg = 0;
    int                   rc;


    listen_fd = socket(AF_INET,SOCK_STREAM,0);
    if(listen < 0)
    {
        printf("create socket failure: %s\n",strerror(errno));
        return -1;
    }
    printf("socket create fd[%d]\n",listen_fd);

    memset(&serv_addr,0,sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(LISTEN_PORT);
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    if(bind(listen_fd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0)
    {
        printf("create socket failure: %s\n",strerror(errno));
        return -2;
    }
    printf("socket[%d] bind on port[%d] for all IP address ok\n",listen_fd,LISTEN_PORT);

    listen(listen_fd,BACKLOG);

    while(1)
    {
        printf("Start waiting and accept new client connect...\n",listen_fd);
        client_fd=accept(listen_fd,(struct sockaddr*)&cli_addr,&cliaddr_len);
        if(client_fd < 0)
        {
            printf("accept new socket failure: %s\n",strerror(errno));
            return -2;
        }
        printf("Accept new client[%s:%d] with fd [%d]\n",inet_ntoa(cli_addr.sin_addr),ntohs(cli_addr.sin_port),
                client_fd);

        memset(buf,0,sizeof(buf));
        if((rv=read(client_fd,buf,sizeof(buf))) < 0)
        {
            printf("Read data from client socket[%d] failure: %s\n",client_fd,strerror(errno));
            close(client_fd);
            continue;
        }
        else if(rv == 0)
        {
            printf("client socket[%d] disconnected\n",client_fd);
            close(client_fd);
            continue;
        }
        memset(devid,0,sizeof(devid));
        temp = 0.0;
        parser_json(buf,devid,sizeof(devid),&temp,timep);
        printf("devid: %s\n time: %s\n temp: %.3f\n",devid,timep,temp);
#if 1
        if(write(client_fd,buf,rv)<0)
        {
            printf("Write %d bytes data back to client[%d] failure: %s\n",rv,client_fd,strerror(errno));
            close(client_fd);
        }
#endif
        sleep(5);
        close(client_fd);
    }
    close(listen_fd);
}
int parser_json(char *buf,char *id,int idsize,float *temp,char *timep)
{
    cJSON              *root;
    cJSON              *item;

    if(!buf || !id || !temp)
    {
        printf("Invalid input arguments\n");
        return -1;
    }


    root = cJSON_Parse(buf);
    if( !root )
    {
        printf("cJSON_Parser buf failure\n");
        return -2;
    }

    item = cJSON_GetObjectItem(root,"id");
    strncpy(id,item->valuestring,idsize);

    item = cJSON_GetObjectItem(root,"time");
    strcpy(timep, item->valuestring);

    item = cJSON_GetObjectItem(root,"temperature");
    *temp = item->valuedouble;

    cJSON_Delete(root);


}
